﻿Imports Negocio
Imports Entidad
Imports System.Resources
Imports Utilitario
Imports System.IO
Imports System.Text.Encoding
Imports System.Net.Mime
Public Class frmDocumento

    'Instancias

    '******************************************************************************************************
    Public pedido As New Pedido
    Dim serv As New pe.com.gulda.servicio
    Dim vendedor As New pe.com.gulda.Vendedor
    Dim cliente As New pe.com.gulda.Cliente

    Dim servicio1 As New PedidoNegocio
    Dim servicio2 As New ArticuloNegocio
    Dim servicio3 As New ClienteNegocio
    Dim servicio4 As New DocumentoClienteNegocio
    Dim servicio5 As New DocumentoClienteDetalleNegocio
    Dim servicio6 As New AgenciaNegocio
    Dim servicio7 As New AuditoriaNegocio
    Dim util As New Utiles

    'Esta instancia se hizo con la finalidad que en articulo abriera otro formulario
    'en el cual busca la instancia primaria
    Public arti As frmBusqArticulo

    'Declaracion de Variables
    '******************************************************************************************************
    Dim CIA As String = "01"
    Dim SUC As String = "01"
    Dim TDOC As String = ""
    'Esta variable almacenara la persona qyue realiza la transaccion
    Dim USU As String = "SEC001"
    Dim IGV As Decimal = 0.18
    'Esta variable nos ayudara a controlar al mostrar la direccion de la sucursal
    Dim booleano1 As Boolean = False
    'Esta variable servirá para controlar el cambio de un campo
    Dim booleano2 As Boolean = False
    'Esta variable servira para controlar los calculos de precios
    Dim booleano3 As Boolean = False

    'Variable del codigo de la moneda del SIS
    Dim monCodigoSIS As String = ""

    'Variables para el articulos Guarda el precio del articulo, excedeDescuento
    ', cantidadDespacho
    Dim otroPrecioArticulo As Decimal = 0
    'En esta variable guardamos tmb el descuento para luego compararlo
    Dim varDescuento As String = "0.0"
    'Estas variables son para cuando le de click en la grilla
    Dim atenArticulo As Integer = 0
    Dim dcdCodigoArt As String = ""
    Dim actiArt As String = ""
    Dim cantArt As Integer = 1
    'Estas variables son para la forma de pago
    Dim cantMinima As Decimal = 0.0
    Dim porcenFP As Decimal = 0.0

    'Metodos
    '******************************************************************************************************
    Sub limpiezaTotal()
        txtPedido.Text = ""
        limpiarTotales()
        limpiarDetallePedido()
        txtVincular.Text = ""
        mostrarEstado("")
        limpiarCliente()
        limpiarTABGeneral()
        limpiarTABAgregarArticulos()
        booleano1 = False
        booleano2 = False
        lblMensaje.Visible = False
        limpiarTABDatosConfirmacion()
        txtPedido.Focus()
    End Sub

    Sub limpiarTotales()
        txtPorPerc.Text = "0.00"
        txtSubTPD.Text = "0.00"
        txtIGV.Text = "0.00"
        txtTotal.Text = "0.00"
    End Sub

    Sub mostrarEstado(codEstado As String)
        If codEstado = "" Then
            txtEstado.Text = ""
            txtEstado.BackColor = Color.White
        ElseIf codEstado = EST_Aprobado Then
            txtEstado.Text = "Aprobado"
            txtEstado.BackColor = Color.Red
        ElseIf codEstado = EST_Ingresado Then
            txtEstado.Text = "Ingresado"
            txtEstado.BackColor = Color.Green
        ElseIf codEstado = EST_Comprometido Then
            txtEstado.Text = "Comprometido"
            txtEstado.BackColor = Color.Purple
        ElseIf codEstado = EST_Observado Then
            txtEstado.Text = "Observado"
            txtEstado.BackColor = Color.Blue
        End If
    End Sub

    Sub limpiarTABGeneral()
        monCodigoSIS = ""
        txtTipoDocumento.Text = ""
        lblTipoDocumento.Text = ""
        txtCondVenta.Text = ""
        lblCondVenta.Text = ""
        txtMoneda.Text = ""
        lblMoneda.Text = ""
        txtListaPrecio.Text = ""
        lblListaPrecio.Text = ""
    End Sub

    Sub limpiarTABAgregarArticulos()
        'precioArticulo = 0
        booleano3 = False
        'artPercepcion = ""
        'artZMergencia = ""
        'undMedida = ""
        'cantDespacho = 1
        cantArt = 1
        atenArticulo = 0
        dcdCodigoArt = ""
        actiArt = ""
        chkCambioDscto.Checked = False
        varDescuento = ""
        otroPrecioArticulo = 0
        txtAlmacen.Text = ""
        lblAlmacen.Text = ""
        txtArticulo.Text = ""
        lblArticulo.Text = ""
        txtPrecio.Text = "0.0"
        txtPrecioSIGV.Text = "0.0"
        txtDescuento.Text = "0.0"
        txtPrecioCIGV.Text = "0.0"
        txtCantidad.Minimum = 1
        txtCantidad.Value = 1
        txtCantidad.Increment = 1
        dgvUltimosDescuentos.Rows.Clear()
        dgvDescArticulo.Rows.Clear()
    End Sub

    Sub limpiarTABDatosConfirmacion()
        cantMinima = 0
        porcenFP = 0.0
        txtFormaPago.Text = ""
        lblFormaPago.Text = ""
        txtSucursal.Text = ""
        lblSucursal.Text = ""
        txtAgencia.Text = ""
        lblAgencia.Text = ""
        txtDireccionEntrega.Text = ""
        lblDireccionEntrega.Text = ""
        mostrarfechaEntrega(Date.Now.ToString("dd/MM/yyyy"))
        mostrarCheckOficinaMuestra("0", "0")
        txtPersonaConfirma.Text = ""
        txtPersonaRecibe.Text = ""
        txtBanco.Text = ""
        lblBanco.Text = ""
        txtDeposito.Text = ""
        txtObservaciones.Text = ""
        txtObsCreditos.Text = ""
    End Sub

    Sub limpiarDeudas()
        TContro1.ImageList = Nothing
        dgvDeuda.Rows.Clear()
    End Sub

    Sub limpiarCliente()
        dgvVinculados.Rows.Clear()
        limpiarDeudas()
        txtCliente.Text = ""
        txtRazonSocial.Text = ""
        txtVendedor.Text = ""
        lblVendedor.Text = ""
        txtCorreo.Text = ""
        txtRuc.Text = ""
        txtSobregiro.Text = ""
        txtDisponible.Text = ""
        txtPendientes.Text = ""
        txtLinea.Text = ""
        txtCliente.Focus()
    End Sub

    Sub recalcularGrillaXMonXLista(moneda As String, monedaSIS As String, listaPrecio As String)
        'con este metodo podremos hacer un recalculo en la grilla cuando
        'se haga un cambio en la moneda o en la lista de precios en
        'los posteriores cambios que pueda sufrir el detalle
        '1) Antes que nada la grilla tiene que tener detalles asi que preguntamos
        If dgvPedido.Rows.Count > 0 Then
            '2) recorremos detalle por detalle para realizar los cambios
            For Each fila As DataGridViewRow In dgvPedido.Rows
                '3) ahora llamamos al metodo actualizaArticuloGrilla
                actualizarArticuloGrilla(fila.Cells("Column6").Value, fila.Cells("Column9").Value, moneda, listaPrecio, monedaSIS, CInt(fila.Cells("cantidad").Value),
                                         CInt(fila.Cells("clmAtendido").Value), CDec(fila.Cells("descuento").Value), CDec(fila.Cells("Column4").Value),
                                         fila.Cells("Column12").Value, fila.Cells("Column13").Value, fila.Cells("Column10").Value, fila.Cells("Column14").Value)
            Next
        End If
    End Sub

    Sub recalcularGrillaXFP(porcentaje As Decimal)
        'con este metodo podremos hacer un recalculo en la grilla cuando
        'se coloque la forma de pago
        '1) Antes que nada la grilla tiene que tener detalles asi que preguntamos
        If dgvPedido.Rows.Count > 0 Then
            '2) recorremos detalle por detalle para realizar los cambios
            For Each fila As DataGridViewRow In dgvPedido.Rows
                '3) ahora llamamos al metodo actualizaArticuloGrilla
                'actualizarArticuloGrilla(fila.Cells("Column6").Value, fila.Cells("Column9").Value, txtMoneda.Text.Trim, txtListaPrecio.Text.Trim, monCodigoSIS, CInt(fila.Cells("cantidad").Value),
                '                         CInt(fila.Cells("clmAtendido").Value), CDec(fila.Cells("descuento").Value), porcentaje,
                '                         fila.Cells("Column12").Value, fila.Cells("Column13").Value, fila.Cells("Column10").Value, fila.Cells("Column14").Value)

                actualizarArticuloGrilla(fila.Cells("Column6").Value, fila.Cells("Column9").Value, txtMoneda.Text.Trim, txtListaPrecio.Text.Trim, monCodigoSIS, CInt(fila.Cells("cantidad").Value),
                                         CInt(fila.Cells("clmAtendido").Value), CDec(fila.Cells("descuento").Value), porcentaje,
                                         fila.Cells("Column12").Value, fila.Cells("Column13").Value, fila.Cells("Column10").Value, "0")
            Next
        End If
    End Sub

    Function buscarArticuloEnGrilla(codArticulo As String) As Integer
        Dim numero As Integer = -1

        For Each fila As DataGridViewRow In dgvPedido.Rows
            If fila.Cells("Column6").Value = codArticulo Then
                If fila.Cells("Column13").Value = "0" Then
                    numero = 0
                ElseIf fila.Cells("Column13").Value = "1" Then
                    numero = 1
                End If
            End If
        Next

        Return numero
    End Function

    Sub iniciarFormulario()
        cargarTiposDocumentos(cboDocumento, "", 2)
    End Sub

    Sub limpiarDetallePedido()
        dgvPedido.Rows.Clear()
    End Sub

    Sub cargarTiposDocumentos(combo As ComboBox, codDocumento As String, tipo As Integer)
        Dim ds As DataSet = servicio1.obtenerTiposDocumentos(codDocumento, tipo)

        With combo
            .DataSource = ds.Tables(0)
            .ValueMember = "TDO_Codigo"
            .DisplayMember = "Abreviatura"
        End With
    End Sub

    Sub listarClientesVinculados(codCliente As String)
        dgvVinculados.Rows.Clear()

        Dim ds As DataSet = servicio3.obtenerClientesVinculados(codCliente)

        For i = 0 To ds.Tables(0).Rows.Count - 1
            dgvVinculados.Rows.Add(ds.Tables(0).Rows(i)("CODIGO").ToString.Trim, ds.Tables(0).Rows(i)("NOM1").ToString.Trim)
        Next

        If ds.Tables(0).Rows.Count <> 0 Then
            dgvVinculados.Rows(0).Selected = False
        End If
    End Sub

    Sub listarDeudas(codCliente As String)
        Dim deudas() As pe.com.gulda.Deuda

        deudas = serv.DocumentosDeuda(txtCliente.Text)

        If deudas.Length() = 0 Then
            TContro1.ImageList = Nothing
        Else
            TContro1.ImageList = ListaImagen
            TContro1.TabPages.Item(2).ImageIndex = 0

            For i = 0 To deudas.Length - 1
                dgvDeuda.Rows.Add(deudas(i).DEU_Tipo, deudas(i).DEU_Numero, deudas(i).DEU_Femision, deudas(i).DEU_FVencimiento, deudas(i).DEU_Moneda,
                                  deudas(i).DEU_Monto, IIf(deudas(i).DEU_Moneda = "S/.", deudas(i).DEU_Saldo, ""), IIf(deudas(i).DEU_Moneda = "US$/.", deudas(i).DEU_Saldo, ""),
                                  deudas(i).DEU_Estado, deudas(i).DEU_Banco, deudas(i).DEU_NroUnico)
            Next
        End If

        If dgvDeuda.RowCount <> 0 Then
            dgvDeuda.Rows(0).Selected = False
        End If
    End Sub

    Sub listarCliente(cliente As pe.com.gulda.Cliente)
        txtCliente.Text = cliente.CLI_Codigo
        txtRazonSocial.Text = cliente.CLI_Descripcion
        If cliente.CLI_Codigo IsNot Nothing Then
            vendedor = serv.obtenerVendedor(cliente.VEN_Codigo)
            txtVendedor.Text = vendedor.VEN_Codigo
            lblVendedor.Text = vendedor.VEN_Descripcion
        End If
        txtCorreo.Text = ""
        If cliente.LE = "" Then
            lblRuc.Text = "RUC :"
            txtRuc.Text = cliente.Ruc
        ElseIf cliente.Ruc = "" Then
            lblRuc.Text = "DNI :"
            txtRuc.Text = cliente.LE
        Else
            lblRuc.Text = "RUC :"
            txtRuc.Text = cliente.Ruc
        End If
        txtSobregiro.Text = cliente.CLI_PorcentajeSobregiro
        txtDisponible.Text = cliente.CLI_SaldoLCredito
        txtPendientes.Text = cliente.CLI_PedidosPendientes
        txtLinea.Text = cliente.CLI_LineaCredito
        listarClientesVinculados(cliente.CLI_Codigo)
        listarDeudas(cliente.CLI_Codigo)
    End Sub

    Sub mostrarTipoDocumento(codTipo As String)
        'Obtenemos el tipo de documento segun el codigo del tipo y mostramos su descripcion
        Dim ds As DataSet = servicio1.obtenerTiposDocumentos(codTipo, 1)

        If ds.Tables(0).Rows.Count > 0 Then
            txtTipoDocumento.Text = ds.Tables(0).Rows(0)("TDO_Codigo").ToString.Trim
            lblTipoDocumento.Text = ds.Tables(0).Rows(0)("TDO_Descripcion").ToString.Trim
        Else
            util.mensaje("El tipo de documento ingresado no existe.")
            txtTipoDocumento.Text = ""
        End If
    End Sub

    Sub mostrarCondicionVenta(codVenta As String, codCliente As String)
        Dim ds As DataSet = servicio1.obtenerCondionesVenta(codVenta, codCliente)

        If ds.Tables(0).Rows.Count > 0 Then
            txtCondVenta.Text = ds.Tables(0).Rows(0)("CNV_Codigo").ToString.Trim
            lblCondVenta.Text = ds.Tables(0).Rows(0)("CNV_Descripcion").ToString.Trim
        Else
            util.mensaje("La condición de venta no existe.")
            txtCondVenta.Text = ""
        End If
    End Sub

    Sub mostrarMoneda(codMoneda As String)
        Dim ds As DataSet = servicio1.obtenerMonedas(codMoneda)

        If ds.Tables(0).Rows.Count > 0 Then
            txtMoneda.Text = ds.Tables(0).Rows(0)("MON_Codigo").ToString.Trim
            lblMoneda.Text = ds.Tables(0).Rows(0)("Descripcion").ToString.Trim
            monCodigoSIS = ds.Tables(0).Rows(0)("MON_CodigoSIS").ToString.Trim
            'hacemos un recálculo del detalle
            recalcularGrillaXMonXLista(ds.Tables(0).Rows(0)("MON_Codigo").ToString.Trim, monCodigoSIS, txtListaPrecio.Text)
            'mostramos los totales
            mostrarTotalesPedido()
        Else
            util.mensaje("La moneda ingresada no existe.")
            txtMoneda.Text = ""
        End If
    End Sub

    Sub mostrarListaPrecios(codLista As String)
        Dim ds As DataSet = servicio1.obtenerListaPrecios(codLista)

        If ds.Tables(0).Rows.Count > 0 Then
            txtListaPrecio.Text = ds.Tables(0).Rows(0)("LIS_Codigo").ToString.Trim
            lblListaPrecio.Text = ds.Tables(0).Rows(0)("LIS_Descripcion").ToString.Trim

            'hacemos un recálculo del detalle
            recalcularGrillaXMonXLista(txtMoneda.Text, monCodigoSIS, ds.Tables(0).Rows(0)("LIS_Codigo").ToString.Trim)
            'mostramos los totales
            mostrarTotalesPedido()
        Else
            util.mensaje("La lista de precio ingresada no existe.")
            txtListaPrecio.Text = ""
        End If
    End Sub

    Sub mostrarSucursalCliente(codSucursal As String, codCliente As String)
        Dim ds As DataSet = servicio1.obtenerAgenciaSucursalXCliente(codSucursal, codCliente)

        If ds.Tables(0).Rows.Count > 0 Then
            txtSucursal.Text = ds.Tables(0).Rows(0)("ATS_Codigo").ToString.Trim
            lblSucursal.Text = ds.Tables(0).Rows(0)("Descripcion").ToString.Trim
            txtAgencia.Text = ds.Tables(0).Rows(0)("AGE_Codigo").ToString.Trim
            lblAgencia.Text = ds.Tables(0).Rows(0)("AGE_Descripcion").ToString.Trim
        Else
            util.mensaje("La sucursal ingresada no existe.")
            txtSucursal.Text = ""
        End If
    End Sub

    Sub mostrarDireccionEntrega(codDireccion As String, codCliente As String)
        Dim ds As DataSet = servicio1.listarDireccionEntrega(txtDireccionEntrega.Text.Trim, txtCliente.Text.Trim)

        If ds.Tables(0).Rows.Count > 0 Then
            txtDireccionEntrega.Text = ds.Tables(0).Rows(0)("CLEN_Codigo").ToString.Trim
            lblDireccionEntrega.Text = ds.Tables(0).Rows(0)("CLEN_Direccion").ToString.Trim
        Else
            util.mensaje("La dirección de entrega no existe.")
            txtDireccionEntrega.Text = ""
        End If
    End Sub

    Sub mostrarfechaEntrega(fecha As String)
        dtpFecEntrega.Text = fecha
    End Sub

    Sub mostrarCheckOficinaMuestra(codOficina As String, codMuestra As String)
        If codOficina = "1" Then
            chkOficina.Checked = True
        Else
            chkOficina.Checked = False
        End If
        If codMuestra = "1" Then
            chkMuestra.Checked = True
        Else
            chkMuestra.Checked = False
        End If
    End Sub

    Sub mostrarPersonaConfirmaRecibe(nombreComfirma As String, nombreRecibe As String)
        txtPersonaConfirma.Text = nombreComfirma
        txtPersonaRecibe.Text = nombreRecibe
    End Sub

    Sub mostrarBanco(codBanco As String)
        Dim ds As DataSet = servicio1.obtenerListaBancos(codBanco)

        If ds.Tables(0).Rows.Count > 0 Then
            txtBanco.Text = ds.Tables(0).Rows(0)("BAN_Codigo").ToString.Trim
            lblBanco.Text = ds.Tables(0).Rows(0)("BAN_Descripcion").ToString.Trim
        Else
            util.mensaje("El banco ingresado no existe.")
            txtBanco.Text = ""
        End If
    End Sub

    Sub mostrarNroDeposito(numero As String)
        txtDeposito.Text = numero
    End Sub

    Sub mostrarObservaciones(observacion As String, obsCreditos As String)
        txtObservaciones.Text = observacion
        txtObsCreditos.Text = obsCreditos
    End Sub

    Sub mostrarAlmacen(codAlmacen As String)
        Dim ds As DataSet = servicio1.listarAlmacen(codAlmacen)

        If ds.Tables(0).Rows.Count > 0 Then
            txtAlmacen.Text = ds.Tables(0).Rows(0)("ALM_Codigo").ToString.Trim
            lblAlmacen.Text = ds.Tables(0).Rows(0)("ALM_Descripcion").ToString.Trim
        Else
            util.mensaje("El almacén ingresado no existe.")
            txtAlmacen.Text = ""
        End If
    End Sub

    Sub mostrarFormaPagoXConsulta(codVenta As String, codMoneda As String, codForma As String)
        Dim ds As DataSet = servicio1.obtenerFormaPago(codVenta, codMoneda, codForma)

        If ds.Tables(0).Rows.Count > 0 Then
            txtFormaPago.Text = ds.Tables(0).Rows(0)("FOP_Codigo").ToString.Trim
            lblFormaPago.Text = ds.Tables(0).Rows(0)("FOP_Descripcion").ToString.Trim
            cantMinima = CInt(ds.Tables(0).Rows(0)("FPM_MontoMinimo").ToString.Trim)
            porcenFP = CDec(ds.Tables(0).Rows(0)("FOP_PorcDsto").ToString.Trim)
        Else
            util.mensaje("El forma de pago ingresado no existe.")
            txtAlmacen.Text = ""
        End If
    End Sub

    Sub mostrarFormaPago(codVenta As String, codMoneda As String, codForma As String)
        Dim ds As DataSet = servicio1.obtenerFormaPago(codVenta, codMoneda, codForma)

        If ds.Tables(0).Rows.Count > 0 Then
            txtFormaPago.Text = ds.Tables(0).Rows(0)("FOP_Codigo").ToString.Trim
            lblFormaPago.Text = ds.Tables(0).Rows(0)("FOP_Descripcion").ToString.Trim
            cantMinima = CInt(ds.Tables(0).Rows(0)("FPM_MontoMinimo").ToString.Trim)
            porcenFP = CDec(ds.Tables(0).Rows(0)("FOP_PorcDsto").ToString.Trim)

            'recalculamos
            recalcularPedidoXFormaPago(porcenFP, CDec(txtTotal.Text.Trim), cantMinima)
            'mostramos los totales
            mostrarTotalesPedido()
        Else
            util.mensaje("El forma de pago ingresado no existe.")
            txtAlmacen.Text = ""
        End If
    End Sub

    Sub transaccionDocumento(codDocumento As String)
        'preguntamos si el codDocumento contiene algo
        If codDocumento = "" Then
            'Si es no es un registro
            'Preguntamos si esta lleno los campos solicitados
            If validacion01() = True Then
                'el registro depende del tipo de documento si es una cotizacion o un pedido
                If TDOC = "P" Then
                    Dim correlativo As String = "00000" & serv.obtenerCorrVend(vendedor.VEN_Codigo)
                    Dim codigo As String = vendedor.VEN_Codigo & correlativo.Substring(correlativo.Length - 5, 5)
                    Dim entPedido As New Pedido(CIA, SUC, TDOC, codigo, txtCliente.Text.Trim, txtVendedor.Text.Trim, txtMoneda.Text.Trim, txtTipoDocumento.Text.Trim, txtCondVenta.Text.Trim, Nothing, Nothing, CDec(0), CDec(0),
                                                CDec(0), CDec(0), CDec(0), "", "", "", EST_Ingresado, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, txtListaPrecio.Text.Trim, Nothing, Date.Now.ToString("dd/MM/yyyy HH:mm:ss"), Nothing, USU)
                    servicio4.registrarDocumentoCliente(entPedido)
                    pedido = entPedido
                    txtPedido.Text = codigo
                    mostrarEstado(EST_Ingresado)
                ElseIf TDOC = "CO" Then
                    Dim codigo As String = servicio4.generarCodigoDocumento(TDOC)
                    Dim entPedido As New Pedido(CIA, SUC, TDOC, codigo, txtCliente.Text, cliente.VEN_Codigo, txtMoneda.Text.Trim, Nothing,
                                         Nothing, Nothing, Nothing, 0, 0, 0, 0, 0, Nothing, Nothing, Nothing, EST_Ingresado, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, txtRazonSocial.Text.Trim, Date.Now, Nothing, USU)
                    servicio4.registrarDocumentoCliente(entPedido)
                    pedido = entPedido
                    txtPedido.Text = codigo
                    mostrarEstado(EST_Ingresado)
                End If
            End If
        ElseIf codDocumento <> "" Then
            'Caso contrario es una actualizacion
            If validacion01() = True Then
                Dim entPedido As New Pedido(CIA, SUC, TDOC, codDocumento, txtCliente.Text.Trim, txtVendedor.Text.Trim, txtMoneda.Text.Trim, txtTipoDocumento.Text.Trim, txtCondVenta.Text.Trim, IIf(txtFormaPago.Text.Trim = "", Nothing, txtFormaPago.Text.Trim), IIf(txtAgencia.Text.Trim = "", Nothing, txtAgencia.Text.Trim), CDec(0), CDec(0),
                                            CDec(0), CDec(0), CDec(0), txtObservaciones.Text.Trim, txtObsCreditos.Text.Trim, txtDireccionEntrega.Text.Trim, EST_Ingresado, IIf(txtDireccionEntrega.Text = "", Nothing, txtDireccionEntrega.Text.Trim), dtpFecEntrega.Text, IIf(chkMuestra.Checked, "1", "0"), IIf(chkOficina.Checked, "1", "0"), txtPersonaConfirma.Text.Trim, txtPersonaRecibe.Text.Trim, txtSucursal.Text.Trim, txtBanco.Text.Trim, txtDeposito.Text.Trim, txtListaPrecio.Text.Trim, txtRazonSocial.Text.Trim, "", Nothing, USU)

                servicio4.actualizarDocumentoCliente(entPedido)
                pedido = entPedido
                'como ha actualizado la variable se vuelve falsa y el mensaje desaparece

                booleano2 = False
                lblMensaje.Visible = False
            End If
        End If

        'realizamos el proceso del boton verificar
        btnVerificar.Focus()
        util.enfocar()
    End Sub

    Sub verificarCambiosPedido()
        'Este metodo estara constantemente verificando el cambio de todo el pedido
        If txtCliente.Text.Trim <> pedido.CLI_Codigo And txtPedido.Text.Trim <> "" Then
            booleano2 = True
            Exit Sub
        End If
        If txtTipoDocumento.Text.Trim <> pedido.TDO_Codigo And txtPedido.Text.Trim <> "" Then
            booleano2 = True
            Exit Sub
        End If
        If txtCondVenta.Text.Trim <> pedido.CNV_Codigo And txtPedido.Text.Trim <> "" Then
            booleano2 = True
            Exit Sub
        End If
        If txtMoneda.Text.Trim <> pedido.MON_Codigo And txtPedido.Text.Trim <> "" Then
            booleano2 = True
            Exit Sub
        End If
        If txtListaPrecio.Text.Trim <> pedido.LIS_Codigo And txtPedido.Text.Trim <> "" Then
            booleano2 = True
            Exit Sub
        End If
    End Sub

    Sub listarDescuentosXArticulo(codArticulo As String)
        dgvDescArticulo.Rows.Clear()

        Dim ds As DataSet = servicio2.obtenerDescuentosXArticulo(codArticulo, 1)

        For i = 0 To ds.Tables(0).Rows.Count - 1
            dgvDescArticulo.Rows.Add(ds.Tables(0).Rows(i)("Cantidad").ToString.Trim, ds.Tables(0).Rows(i)("Porcentaje").ToString.Trim, ds.Tables(0).Rows(i)("Porcen").ToString.Trim)
        Next

        If ds.Tables(0).Rows.Count <> 0 Then
            dgvDescArticulo.Rows(0).Selected = False
        End If
    End Sub

    Sub mostrarArticulo(codArticulo As String, codAlmacen As String)
        Dim ds As DataSet = servicio2.obtenerArticulosXFiltro(codArticulo, "", "", codAlmacen, "", CInt("0"), CDec("0"), "1")

        If ds.Tables(0).Rows.Count > 0 Then
            'obtenemos el articulo
            Dim entArticulo As Articulo = servicio2.obtenerArticulo(codArticulo)
            txtArticulo.Text = codArticulo
            'seteamos la descripcion del articulo
            lblArticulo.Text = entArticulo.ART_Descripcion
            'seteamos en las variables el precio del articulo
            Dim articulo As New pe.com.gulda.Articulo
            articulo.ART_Codigo = codArticulo
            Dim precioArticulo As Decimal = serv.obtenerNvoPrecio(articulo, txtListaPrecio.Text.Trim, monCodigoSIS)
            txtPrecio.Text = precioArticulo
            If monCodigoSIS = "1" Then
                otroPrecioArticulo = serv.obtenerNvoPrecio(articulo, txtListaPrecio.Text.Trim, "0")
            ElseIf monCodigoSIS = "0" Then
                otroPrecioArticulo = serv.obtenerNvoPrecio(articulo, txtListaPrecio.Text.Trim, "1")
            End If
            'seteamos en estas variables la percepcion del articulo
            'la zona de emergencia, la unidad de medida y  cantDespacho
            'artPercepcion = ds.Tables(0).Rows(0)("ART_Percepcion").ToString.Trim
            'artZMergencia = ds.Tables(0).Rows(0)("ART_ZEmergencia").ToString.Trim
            'undMedida = ds.Tables(0).Rows(0)("UNM_Abreviatura").ToString.Trim
            'cantDespacho = CInt(ds.Tables(0).Rows(0)("ARS_CantidadDesp").ToString.Trim)
            'listamos sus descuentos
            listarDescuentosXArticulo(codArticulo)
            txtCantidad.Minimum = entArticulo.ART_Despacho
            txtCantidad.Value = entArticulo.ART_Despacho
            txtCantidad.Increment = entArticulo.ART_Despacho
            booleano3 = True
        Else
            util.mensaje("El codigo del artículo ingresado no existe.")
            limpiarTABAgregarArticulos()
            txtAlmacen.Focus()
        End If
    End Sub

    Sub recalcularPedidoXFormaPago(porcentaje As Decimal, total As Decimal, cantMinima As Decimal)
        'primero validamos que el total sea mayor que la cantidad  minima
        If total >= cantMinima Then
            'como es mayor lo recalculamos en la grilla
            recalcularGrillaXFP(porcentaje)
        Else
            util.mensaje("El total no sobrepasa la cantidad mínima para el descuento.")
            txtFormaPago.Text = ""
        End If
    End Sub

    Function obtenerPorcentajePercepcion(artPercepcion As Decimal, artZEmergencia As Decimal, entCliente As pe.com.gulda.Cliente) As Decimal
        Dim ds As DataSet = servicio1.obtenerPorcentajePercepcion(artPercepcion, artZEmergencia,
                                                                  IIf(entCliente.CLI_Codigo Is Nothing, "0", IIf(entCliente.CLI_Retencion = "N", "0", "1")),
                                                                  IIf(entCliente.CLI_Codigo Is Nothing, "0", IIf(entCliente.CLI_Percepcion = "N", "0", "1")), IIf(cliente.CLI_Codigo Is Nothing, "150108", entCliente.DIS_Codigo))
        Dim porcentaje As Decimal = Math.Round(CDec(ds.Tables(0).Rows(0)("PERC_Porcentaje").ToString.Trim), 2)
        Return porcentaje
    End Function

    Sub transaccionDetalle(codPedido As String)
        '1) Primero verificamos si la grilla tiene registros
        If dgvPedido.Rows.Count > 0 Then
            '2)Vemos que si hay registros, entonces recorremos la grilla
            For Each fila As DataGridViewRow In dgvPedido.Rows
                '3) Verificamos su existencia
                Dim ds As DataSet = servicio5.obtenerDetallePedidoXART(fila.Cells("Column6").Value, codPedido, TDOC, SUC, CIA)
                If ds.Tables(0).Rows.Count > 0 Then
                    If fila.Cells("Column14").Value = "0" And fila.Cells("Column13").Value = "1" Then
                        'Son los nuevos o los que han sido cambiados pero estan activos
                        'si trajo una info entonces se trata de actualizacion
                        Dim numberDetalle As Integer = CInt(ds.Tables(0).Rows(0)("DCD_Codigo").ToString.Trim)
                        Dim stockReal As Decimal = servicio5.obtenerStockXDetalle(fila.Cells("Column6").Value)
                        If CDec(fila.Cells("cantidad").Value) <= stockReal Then
                            stockReal = CDec(fila.Cells("cantidad").Value)
                        End If
                        Dim detalle As New PedidoDetalle(CIA, SUC, TDOC, codPedido, numberDetalle, fila.Cells("Column6").Value,
                                                             fila.Cells("Column9").Value, fila.Cells("cantidad").Value, stockReal, CDec(fila.Cells("descuento").Value),
                                                             fila.Cells("Column10").Value, CDec(fila.Cells("Column7").Value), CDec(fila.Cells("Column8").Value),
                                                             CDec(fila.Cells("Column4").Value), CDec(fila.Cells("Column5").Value), "", CDec(fila.Cells("subTotal").Value), CDec(fila.Cells("Column1").Value), fila.Cells("Column13").Value)

                        servicio5.actualizarDocumentoClienteDetalle(detalle)
                    ElseIf (fila.Cells("Column14").Value = "0" Or fila.Cells("Column14").Value = "1") And fila.Cells("Column13").Value = "0" Then
                        'son los nuevos o verificados o modificados pero que van a ser borrados
                        Dim numberDetalle As Integer = CInt(ds.Tables(0).Rows(0)("DCD_Codigo").ToString.Trim)
                        Dim stockReal As Decimal = CDec(fila.Cells("cantidad").Value)
                        Dim detalle As New PedidoDetalle(CIA, SUC, TDOC, codPedido, numberDetalle, fila.Cells("Column6").Value,
                                                             fila.Cells("Column9").Value, fila.Cells("cantidad").Value, stockReal, CDec(fila.Cells("descuento").Value),
                                                             fila.Cells("Column10").Value, CDec(fila.Cells("Column7").Value), CDec(fila.Cells("Column8").Value),
                                                             CDec(fila.Cells("Column4").Value), CDec(fila.Cells("Column5").Value), "", CDec(fila.Cells("subTotal").Value), CDec(fila.Cells("Column1").Value), fila.Cells("Column13").Value)

                        servicio5.actualizarDocumentoClienteDetalle(detalle)
                    End If
                Else
                    'no trajo campos entonces comenzamos a registrar
                    If fila.Cells("Column13").Value = "1" Then
                        Dim numberDetalle As Integer = servicio5.obtenerDetallePedido(codPedido, TDOC, SUC, CIA, "").Tables(0).Rows.Count + 1
                        Dim stockReal As Decimal = servicio5.obtenerStockXDetalle(fila.Cells("Column6").Value)
                        If CDec(fila.Cells("cantidad").Value) <= stockReal Then
                            stockReal = CDec(fila.Cells("cantidad").Value)
                        End If
                        Dim detalle As New PedidoDetalle(CIA, SUC, TDOC, codPedido, numberDetalle, fila.Cells("Column6").Value,
                                                         fila.Cells("Column9").Value, fila.Cells("cantidad").Value, stockReal, CDec(fila.Cells("descuento").Value),
                                                         fila.Cells("Column10").Value, CDec(fila.Cells("Column7").Value), CDec(fila.Cells("Column8").Value),
                                                         CDec(fila.Cells("Column4").Value), CDec(fila.Cells("Column5").Value), "", CDec(fila.Cells("subTotal").Value), CDec(fila.Cells("Column1").Value), "1")

                        servicio5.registrarDocumentoClienteDetalle(detalle)
                    End If
                End If
            Next
            'listamos el detalle
            listarDetallePedido(codPedido)

            'realizamos un cambio en el estado del pedido
            If verificarDetalleAtendidoParaComprometer(dgvPedido) = True Then
                servicio7.actualizarUsuarioEstadoPedido(USU, EST_Comprometido, CIA, SUC, TDOC, codPedido)
                mostrarEstado(EST_Comprometido)
            Else
                servicio7.actualizarUsuarioEstadoPedido(USU, EST_Ingresado, CIA, SUC, TDOC, codPedido)
                mostrarEstado(EST_Ingresado)
            End If
        End If
    End Sub

    Sub agregarArticuloGrilla(numero As Integer, almacen As String, codArticulo As String, descripcion As String, uniMedida As String,
                              precio As Decimal, cantidad As Integer, atendido As Integer, descuento As Decimal,
                              descCondicional As Decimal, porcPercepcion As Decimal, subtotal As Decimal, precSoles As Decimal,
                              precDolares As Decimal, porcMontoPerc As Decimal, dcdCodigo As String, activate As Integer, excedDscto As String, verif As String)

        dgvPedido.Rows.Add(numero, codArticulo, almacen, descripcion, uniMedida, precio, cantidad, atendido, descuento, descCondicional, porcPercepcion,
                           subtotal, precSoles, precDolares, porcMontoPerc, dcdCodigo, activate, excedDscto, verif)

        limpiarTABAgregarArticulos()
        txtAlmacen.Focus()

        If dgvPedido.Rows.Count > 0 Then
            dgvPedido.Rows(0).Selected = False
        End If
    End Sub

    Sub actualizarArticuloGrilla(codArticulo As String, alm As String, codMoneda As String, codLista As String, codMonSIS As String,
                                 cant As Integer, aten As Integer, desc As Decimal, descCond As Decimal, dcdCod As String, act As String, excDesc As String, verif As String)
        'calculamos los valores para el ingreso a la grilla}
        Dim entArticulo As Articulo = servicio2.obtenerArticulo(codArticulo)
        Dim articulo As New pe.com.gulda.Articulo
        articulo.ART_Codigo = codArticulo
        Dim otroPrecioArt As Decimal = 0
        Dim precioArt As Decimal = serv.obtenerNvoPrecio(articulo, codLista, codMonSIS)
        If codMonSIS = "1" Then
            otroPrecioArt = serv.obtenerNvoPrecio(articulo, codLista, "0")
        ElseIf codMonSIS = "0" Then
            otroPrecioArt = serv.obtenerNvoPrecio(articulo, codLista, "1")
        End If
        Dim porcPercepcionArt As Decimal = obtenerPorcentajePercepcion(CDec(entArticulo.ART_Percepcion), CDec(entArticulo.ART_ZEmergencia), cliente)
        Dim subtotalArt As Decimal = calcularSubtotalArticulo(precioArt, IIf(aten = 0, cant, aten), desc / 100, descCond / 100, porcPercepcionArt / 100)
        Dim precioSoles As Decimal = IIf(codMoneda = "01", precioArt, otroPrecioArt)
        Dim precioDolares As Decimal = calcularPrecioARTSinIGV(IIf(codMoneda = "02", precioArt, otroPrecioArt), desc / 100)
        Dim montoPercepcion As Decimal = calcularMontoPorcPercepcion(porcPercepcionArt / 100, subtotalArt)

        For Each fila As DataGridViewRow In dgvPedido.Rows
            If fila.Cells("Column6").Value = codArticulo Then
                'seteamos todos los valores
                fila.Cells("Column9").Value = alm
                fila.Cells("artDescripcion").Value = entArticulo.ART_Descripcion
                fila.Cells("Column11").Value = entArticulo.UNM_Descripcion
                fila.Cells("precio").Value = precioArt
                fila.Cells("cantidad").Value = cant
                fila.Cells("clmAtendido").Value = aten
                fila.Cells("descuento").Value = desc
                fila.Cells("Column4").Value = Format(Val(descCond), "##,##0.00")
                fila.Cells("Column5").Value = porcPercepcionArt
                fila.Cells("subTotal").Value = subtotalArt
                fila.Cells("Column7").Value = precioSoles
                fila.Cells("Column8").Value = precioDolares
                fila.Cells("Column1").Value = montoPercepcion
                fila.Cells("Column12").Value = dcdCod
                fila.Cells("Column13").Value = act
                fila.Cells("Column10").Value = excDesc
                fila.Cells("Column14").Value = verif

                Exit For
            End If
        Next

        limpiarTABAgregarArticulos()
        txtAlmacen.Focus()

        If dgvPedido.Rows.Count > 0 Then
            dgvPedido.Rows(0).Selected = False
        End If

    End Sub

    Sub listarDetallePedido(codPedido As String)
        limpiarDetallePedido()

        Dim ds As DataSet = servicio5.obtenerDetallePedido(codPedido, TDOC, SUC, CIA, "1")

        If ds.Tables(0).Rows.Count > 0 Then
            For i = 0 To ds.Tables(0).Rows.Count - 1
                'Se procede a la insercion en la grilla
                Dim numeracion As Integer = i + 1
                Dim almacen As String = ds.Tables(0).Rows(i)("ALM_Codigo").ToString.Trim
                Dim entArticulo As Articulo = servicio2.obtenerArticulo(ds.Tables(0).Rows(i)("ART_Codigo").ToString.Trim)
                Dim precio As Decimal = CDec(ds.Tables(0).Rows(i)("Precio").ToString.Trim)
                Dim cantidad As Integer = CInt(ds.Tables(0).Rows(i)("DCD_Ordenado").ToString.Trim)
                Dim atendido As Integer = CInt(ds.Tables(0).Rows(i)("DCD_Atendido").ToString.Trim)
                Dim descuento As Decimal = CDec(ds.Tables(0).Rows(i)("DCD_Descuento").ToString.Trim)
                Dim descCondicional As Decimal = CDec(ds.Tables(0).Rows(i)("DCD_DsctoCond").ToString.Trim)
                Dim porcPercepcion As Decimal = obtenerPorcentajePercepcion(CDec(entArticulo.ART_Percepcion), CDec(entArticulo.ART_ZEmergencia), cliente)
                Dim subtotal As Decimal = calcularSubtotalArticulo(precio, atendido, descuento / 100, descCondicional / 100, porcPercepcion / 100)
                Dim precioSoles As Decimal = CDec(ds.Tables(0).Rows(i)("DCD_ValorUnitSoles").ToString.Trim)
                Dim precioDolares As Decimal = CDec(ds.Tables(0).Rows(i)("DCD_ValorUnitDolares").ToString.Trim)
                Dim montoPercepcion As Decimal = CDec(ds.Tables(0).Rows(i)("DCD_MontoPerc").ToString.Trim)
                Dim dcdCodigo As String = ds.Tables(0).Rows(i)("DCD_Codigo").ToString.Trim
                Dim activado As String = "1"
                Dim excDscto As String = ds.Tables(0).Rows(i)("DCD_DsctoAdicional").ToString.Trim
                Dim verificado As String = "1"

                agregarArticuloGrilla(numeracion, almacen, entArticulo.ART_Codigo, entArticulo.ART_Descripcion, entArticulo.UNM_Descripcion, precio, cantidad, atendido, descuento,
                                      Format(Val(descCondicional), "##,##0.00"), porcPercepcion, subtotal, precioSoles, precioDolares, montoPercepcion, dcdCodigo, activado, excDscto, verificado)
            Next
        End If
    End Sub

    Sub mostrarTotalesPedido()
        'mostramos los totales
        txtPorPerc.Text = Format(Val(calcularMontoTotalPercepcion()), "##,##0.00")
        txtSubTPD.Text = Format(Val(calcularSubtotalPedido()), "##,##0.00")
        txtIGV.Text = calcularIGV(CDec(txtSubTPD.Text))
        txtTotal.Text = calcularTotalPedido(CDec(txtPorPerc.Text), CDec(txtIGV.Text), CDec(txtSubTPD.Text))
    End Sub

    Sub eliminarDocumento(codPedido As String)
        If codPedido = "" Then
            util.mensaje("No ha ingresado el código del pedido o cotización")
            Exit Sub
        End If
        If MsgBox("¿Está seguro que desea anular el documento?", MsgBoxStyle.Question + MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton2, "Mensajes al Usuario") = MsgBoxResult.Yes Then
            servicio4.actualizarEstadoPedido(codPedido, EST_Anulado, TDOC)
            util.mensaje("El documento se anuló correctamente.")
            limpiezaTotal()
            txtPedido.Focus()
        End If
    End Sub

    Sub imprimirDocumento()
        Dim ds As New dsDetalle

        For Each fila As DataGridViewRow In dgvPedido.Rows
            ds.Tables("DetallePedido").Rows.Add(fila.Cells("clmItem").Value, fila.Cells("Column6").Value, txtAlmacen.Text.Trim,
                                                fila.Cells("Column11").Value, fila.Cells("artDescripcion").Value, fila.Cells("cantidad").Value,
                                                fila.Cells("clmAtendido").Value, CInt(fila.Cells("cantidad").Value) - CInt(fila.Cells("clmAtendido").Value), fila.Cells("precio").Value,
                                                fila.Cells("descuento").Value & " %", fila.Cells("Column4").Value & " %", "0", IIf(CDec(fila.Cells("Column1").Value) > 0, "S", "N"), fila.Cells("Column1").Value, fila.Cells("subTotal").Value, IIf(txtMoneda.Text = "01", fila.Cells("Column7").Value, fila.Cells("Column8").Value))
        Next

        Dim frmImpDoc As New frmImpresionDocumento(TDOC, txtPedido.Text, txtRuc.Text.Trim, txtCliente.Text, txtRazonSocial.Text.Trim, "(" & txtCondVenta.Text & ") " & lblCondVenta.Text,
                                                       pedido.DCI_Fecha, pedido.CLI_Marca, "(" & txtMoneda.Text & ") " & lblMoneda.Text, "(" & txtSucursal.Text & ") " & lblSucursal.Text, txtObservaciones.Text.Trim, lblDireccionEntrega.Text.Trim, CDec(txtSubTPD.Text), CDec(txtIGV.Text), CDec(txtPorPerc.Text), ds)
        frmImpDoc.ShowDialog()
    End Sub

    Sub enviarMensaje()
        If txtCorreo.Text = "" Then
            util.mensaje("Ingrese el correo del cliente.")
            Exit Sub
        End If

        'primero instanciamos
        Dim servicio As New Referencia1.EnvioEstadoCtaClient
        Dim valor1 As Boolean = False
        Dim valor2 As Boolean = False
        Dim valor3 As Boolean = False

        'segundo verificamos si es pedido o cotizacion
        Dim rutaOrig As String = ""
        Dim rutaDest As String = "C:\Archivo\Documento.pdf"

        If TDOC = "P" Then
            rutaOrig = "C:\Users\malarcon\Desktop\Proyecto\SistemaIntegral\Presentacion\RegistroPedido\RPT\rptDocumento1.rpt"
        ElseIf TDOC = "CO" Then
            rutaOrig = "C:\Users\malarcon\Desktop\Proyecto\SistemaIntegral\Presentacion\RegistroPedido\RPT\rptDocumento2.rpt"
        End If

        Dim ds As New dsDetalle

        For Each fila As DataGridViewRow In dgvPedido.Rows
            ds.Tables("DetallePedido").Rows.Add(fila.Cells("clmItem").Value, fila.Cells("Column6").Value, txtAlmacen.Text.Trim,
                                                fila.Cells("Column11").Value, fila.Cells("artDescripcion").Value, fila.Cells("cantidad").Value,
                                                fila.Cells("clmAtendido").Value, CInt(fila.Cells("cantidad").Value) - CInt(fila.Cells("clmAtendido").Value), fila.Cells("precio").Value,
                                                fila.Cells("descuento").Value & " %", fila.Cells("Column4").Value & " %", "0", IIf(CDec(fila.Cells("Column1").Value) > 0, "S", "N"), fila.Cells("Column1").Value, fila.Cells("subTotal").Value, IIf(txtMoneda.Text = "01", fila.Cells("Column7").Value, fila.Cells("Column8").Value))
        Next

        valor1 = servicio.generarPDF(rutaOrig, rutaDest, TDOC, ds, txtPedido.Text, txtCliente.Text, txtRazonSocial.Text, "(" & txtCondVenta.Text & ") " & lblCondVenta.Text,
                                            pedido.DCI_Fecha, pedido.CLI_Marca, "(" & txtMoneda.Text & ") " & lblMoneda.Text, "(" & txtSucursal.Text & ") " & lblSucursal.Text, CDec(txtSubTPD.Text), CDec(txtIGV.Text), CDec(txtPorPerc.Text), txtObservaciones.Text, lblDireccionEntrega.Text, txtRuc.Text)

        If valor1 = True Then
            'Si estuvo correcta la exportacion, enviarlo por correo
            Dim fs As FileStream = File.OpenRead(rutaDest)
            Dim data(fs.Length - 1) As Byte
            fs.Read(data, 0, data.Length)
            Dim memoria As New MemoryStream(data)
            'Dim bytes As Byte() = UTF8.GetBytes(rutaDest)
            'memoria.Write(bytes, 0, bytes.Length)
            'memoria.Seek(0, SeekOrigin.Begin)

            Dim tipContenido As New ContentType("application/pdf")
            tipContenido.MediaType = MediaTypeNames.Application.Octet
            tipContenido.Name = "Documento.pdf"

            Dim emisor As String = "malarcon@gulda.com.pe"
            Dim receptor As String = txtCorreo.Text
            'Dim rutaCarpeta As String = "C:\Archivo"
            valor2 = servicio.enviarEmail(emisor, receptor, "Prueba del Documento", "", "", "Si recibes el correo es por que está bien el envio.", memoria, tipContenido)

            If valor2 = True Then
                util.mensaje("El envió se realizó de manera correcta.")
                fs.Dispose()
                memoria.Close()
                memoria.Dispose()
            Else
                util.mensaje("Ocurrió un error en el envio del correo.")
            End If
        Else
            util.mensaje("Ocurrió un error al exportar el documento.")
        End If
    End Sub

    Sub aprobarPedido(codPedido As String, tipoDoc As String)
        Dim frmAprobar As New frmAprobacion(codPedido, tipoDoc)
        If frmAprobar.ShowDialog = Windows.Forms.DialogResult.OK Then
            txtObsCreditos.Text = pedido.DCI_OBSCredito
            mostrarEstado(pedido.DCI_Estado)
        Else

        End If
    End Sub

    'Metodos de cálculo
    '******************************************************************************************************
    'Metodo para calcular el descuento del artículo según la cantidad
    Function calcularDescuentoCantidad(cantidad As Integer) As Decimal
        Dim porcentaje As Decimal = 0

        For Each fila As DataGridViewRow In dgvDescArticulo.Rows
            If cantidad >= CInt(fila.Cells("cml1").Value) Then
                porcentaje = CDec(fila.Cells("cml3").Value.ToString.Trim)
            End If
        Next

        Return porcentaje
    End Function

    'Metodo para calcular el precio del articulo sin IGV
    Function calcularPrecioARTSinIGV(precioArticulo As Decimal, descuento As Decimal) As Decimal
        Dim precioSIGV As Decimal = 0

        precioSIGV = precioArticulo * (1 - (descuento) / 100)

        Return precioSIGV
    End Function

    'Metodo para calcular el precio del articulo con IGV
    Function calcularPrecioARTConIGV(precioSinIGV As Decimal) As Decimal
        Dim precioConIGV As Decimal = 0

        precioConIGV = precioSinIGV * 1.18

        Return precioConIGV
    End Function

    'Metodo para calcular el subtotal del articulo
    Function calcularSubtotalArticulo(precio As Decimal, cantidad As Integer, descuento As Decimal, descCondicional As Decimal, porcPercepcion As Decimal) As Decimal
        Dim subtotal As Decimal = 0

        subtotal = Math.Round(((precio * cantidad) * (1 - descuento)) * (1 - descCondicional), 2)

        Return subtotal
    End Function

    'Metodo para calcular el montoDePercepcion
    Function calcularMontoPorcPercepcion(porcPercepcion As Decimal, subtotal As Decimal) As Decimal
        Dim montoPercepcion As Decimal = 0

        montoPercepcion = Math.Round(porcPercepcion * subtotal, 2)

        Return montoPercepcion
    End Function

    'Metodo para calcular el montoTotal de percepcion
    Function calcularMontoTotalPercepcion() As Decimal
        Dim monto As Decimal = 0

        For Each fila As DataGridViewRow In dgvPedido.Rows
            'preguntamos si se quiere ese articulo
            If fila.Cells("Column13").Value = "1" Then
                monto = monto + CDec(fila.Cells("Column1").Value)
            End If
        Next

        Return monto
    End Function

    'Metodo para calcular el subtotal del pedido
    Function calcularSubtotalPedido() As Decimal
        Dim subtotal As Decimal = 0

        For Each fila As DataGridViewRow In dgvPedido.Rows
            If fila.Cells("Column13").Value = "1" Then
                subtotal = subtotal + CDec(fila.Cells("subTotal").Value)
            End If
        Next

        Return subtotal
    End Function

    'Metodo para calcular el igv total
    Function calcularIGV(subtotal As Decimal) As Decimal
        Dim montoIGV As Decimal = 0

        montoIGV = Math.Round(IGV * subtotal, 2)

        Return montoIGV
    End Function

    'metodo para calcular el total del pedido
    Function calcularTotalPedido(percepcion As Decimal, igv As Decimal, subtotal As Decimal) As Decimal
        Dim total As Decimal = 0

        total = percepcion + igv + subtotal

        Return total
    End Function

    'metodo para verificar si trajo detalles con cantidades atendidas
    Function verificarDetalleAtendidoParaComprometer(dgv As DataGridView) As Boolean
        Dim contador As Integer = 0
        Dim valor As Boolean = False

        For Each fila As DataGridViewRow In dgv.Rows
            If fila.Cells("Column13").Value = "1" And fila.Cells("Column14").Value = "1" And CInt(fila.Cells("clmAtendido").Value) > 0 Then
                contador = contador + 1
            End If
        Next

        If contador > 0 Then
            valor = True
        End If

        Return valor
    End Function

    'Validaciones (Funciones)
    '******************************************************************************************************
    'Esta validacion comprende al cambio de tab de General hacia Artículo
    Function validacion01() As Boolean
        If txtCliente.Text = "" Then
            util.mensaje("Código del cliente incorrecto o no ingresado.")
            Return False
            Exit Function
        End If
        If txtTipoDocumento.Text = "" Then
            util.mensaje("Tipo de documento incorrecto o no ingresado.")
            Return False
            Exit Function
        End If
        If txtCondVenta.Text = "" Then
            util.mensaje("Condición de venta incorrecta o no ingresada.")
            Return False
        End If
        If txtMoneda.Text = "" Then
            util.mensaje("La moneda es incorrecta o no ingresada.")
            Return False
            Exit Function
        End If
        If txtListaPrecio.Text = "" Then
            util.mensaje("Lista de precios incorrecta o no ingresada.")
            Return False
            Exit Function
        End If
        'Si al finalizar todo no ha ingresado a ningún if devuelve verdadero
        Return True
    End Function

    'Esta validacion ayuda a verificar los cambios que pudo haber sufrido el pedido
    Sub validacion02()
        If booleano2 = True Then
            lblMensaje.Visible = True
            Exit Sub
        Else
            verificarCambiosPedido()
        End If
    End Sub

    'Eventos
    '******************************************************************************************************
    Private Sub cboDocumento_SelectedValueChanged(sender As Object, e As System.EventArgs) Handles cboDocumento.SelectedValueChanged
        'Al cambio del valor del cboDocumento la variable TDOC cambia de valor
        TDOC = cboDocumento.SelectedValue.ToString
        If TDOC = "P" Then
            'si es un pedido hacemos que se limpie todo el formulario
            limpiezaTotal()
        ElseIf TDOC = "CO" Then
            'obtenemos al cliente de prueba
            Dim codcli As String = "00-001"
            cliente = serv.obtenerClientesXId(codcli)
            'luego lo mostramos
            listarCliente(cliente)
            txtRazonSocial.Text = ""
            txtPedido.Focus()
        End If
    End Sub

    Private Sub frmDocumento_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        'Inicializamos el formulario
        iniciarFormulario()
    End Sub

    Private Sub txtCliente_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles txtCliente.KeyDown
        'Obtenemos el valor de la caja de texto as string
        Dim texto As String = txtCliente.Text.Trim

        If e.KeyValue = Keys.Enter Then
            If texto = "" Then
                'si esta vacio limpiamos las cajas de texto
                limpiarCliente()
                limpiarDeudas()
            Else
                cliente = serv.obtenerClientesXId(texto)
                If cliente.CLI_Codigo Is Nothing And cliente.CLI_Codigo <> "" Then
                    util.mensaje("Cliente no existe.")
                    limpiarCliente()
                Else
                    listarCliente(cliente)
                    'el foco se va a tipo de documento
                    txtTipoDocumento.Focus()
                End If
            End If
        ElseIf e.KeyValue = Keys.Add Then
            Dim busqueda As New frmBusqCliente
            If busqueda.ShowDialog() = Windows.Forms.DialogResult.OK Then
                util.enfocar()
            Else
                txtCliente.Text = ""
            End If
        End If
    End Sub

    Private Sub txtPedido_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles txtPedido.KeyDown
        'Obtenemos el texto de la caja de texto
        Dim texto As String = txtPedido.Text.Trim

        If e.KeyValue = Keys.Enter Then
            If texto = "" Then
                'La caja de texto esta vacia limpia todo
                limpiezaTotal()
            Else
                'Obtenemos el pedido
                pedido = servicio4.obtenerDocumentoCliente(CIA, SUC, TDOC, texto)
                'preguntamos si ha traido informacion del pedido
                If pedido Is Nothing Then
                    util.mensaje("Documento no encontrado.")
                    'metodo de limpieza
                    Exit Sub
                Else
                    'aqui encontro un pedido entonces comenzamos a setear todo su contenido
                    mostrarEstado(pedido.DCI_Estado)
                    Dim cliente As pe.com.gulda.Cliente
                    cliente = serv.obtenerClientesXId(pedido.CLI_Codigo)
                    listarCliente(cliente)
                    mostrarTipoDocumento(pedido.TDO_Codigo)
                    mostrarCondicionVenta(pedido.CNV_Codigo, pedido.CLI_Codigo)
                    mostrarMoneda(pedido.MON_Codigo)
                    mostrarListaPrecios(pedido.LIS_Codigo)
                    If pedido.ATS_Codigo <> "" Then
                        mostrarSucursalCliente(pedido.ATS_Codigo, pedido.CLI_Codigo)
                    End If
                    If pedido.CLEN_Codigo <> "" Then
                        mostrarDireccionEntrega(pedido.CLEN_Codigo, pedido.CLI_Codigo)
                    End If
                    mostrarfechaEntrega(pedido.FEC_Entrega)
                    mostrarCheckOficinaMuestra(pedido.DCI_Oficina, pedido.DCI_Muestra)
                    mostrarPersonaConfirmaRecibe(pedido.PERS_Confirma, pedido.PERS_Recibe)
                    If pedido.BAN_Codigo <> "" Then
                        mostrarBanco(pedido.BAN_Codigo)
                    End If
                    mostrarNroDeposito(pedido.NRO_Deposito)
                    mostrarObservaciones(pedido.DCI_Observaciones, pedido.DCI_OBSCredito)
                    If cboDocumento.SelectedValue.ToString = "CO" Then
                        txtRazonSocial.Text = pedido.DCI_RazonCot
                    End If
                    If pedido.FOP_Codigo <> "" Then
                        mostrarFormaPagoXConsulta(pedido.CNV_Codigo, pedido.MON_Codigo, pedido.FOP_Codigo)
                    End If
                    listarDetallePedido(pedido.DCI_Codigo)
                    'mostramos los totales
                    mostrarTotalesPedido()
                End If
            End If
        ElseIf e.KeyValue = Keys.Add Then
            Dim frmBusqueda As New frmBusqDocumento(txtCliente.Text.Trim, TDOC)
            If frmBusqueda.ShowDialog = Windows.Forms.DialogResult.OK Then
                util.enfocar()
            Else
                txtPedido.Text = ""
            End If
        End If
    End Sub

    Private Sub btnNuevo_Click(sender As System.Object, e As System.EventArgs) Handles btnNuevo.Click
        'Este boton solo limpia todo el formulario induciendo que se ingresar un nuevo pedido
        limpiezaTotal()
    End Sub

    Private Sub txtTipoDocumento_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles txtTipoDocumento.KeyDown
        'aqui traemos la descripcion del tipo de documento
        Dim texto As String = txtTipoDocumento.Text.Trim
        If e.KeyValue = Keys.Enter Then
            If texto = "" Then
                lblTipoDocumento.Text = ""
            Else
                mostrarTipoDocumento(texto)
                'llevamos el foco a condicion venta
                txtCondVenta.Focus()
            End If
        ElseIf e.KeyValue = Keys.Add Then
            Dim ds As DataSet = servicio1.obtenerTiposDocumentos("", 1)
            Dim tipos As New frmTiposDocumento(ds)
            If tipos.ShowDialog() = Windows.Forms.DialogResult.OK Then
                util.enfocar()
            Else
                txtTipoDocumento.Text = ""
            End If
        End If
    End Sub

    Private Sub txtCondVenta_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles txtCondVenta.KeyDown
        Dim texto As String = txtCondVenta.Text.Trim

        If e.KeyValue = Keys.Enter Then
            If texto = "" Then
                lblCondVenta.Text = ""
                txtFormaPago.Text = ""
                lblFormaPago.Text = ""
                cantMinima = 0.0
                porcenFP = 0.0
                recalcularPedidoXFormaPago(0, CDec(txtTotal.Text.Trim), cantMinima)
                mostrarTotalesPedido()
            Else
                mostrarCondicionVenta(texto, txtCliente.Text.Trim)
                'llevamos el foco a moneda
                txtMoneda.Focus()
            End If
        ElseIf e.KeyValue = Keys.Add Then
            Dim ds As DataSet = servicio1.obtenerCondionesVenta("", txtCliente.Text.Trim)
            Dim condicion As New frmCondicionVenta(ds)
            If condicion.ShowDialog() = Windows.Forms.DialogResult.OK Then
                util.enfocar()
                txtFormaPago.Text = ""
                lblFormaPago.Text = ""
                cantMinima = 0.0
                porcenFP = 0.0
                recalcularPedidoXFormaPago(0, CDec(txtTotal.Text.Trim), cantMinima)
                mostrarTotalesPedido()
            Else
                txtCondVenta.Text = ""
            End If
        End If
    End Sub

    Private Sub txtMoneda_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles txtMoneda.KeyDown
        Dim texto As String = txtMoneda.Text.Trim

        If e.KeyValue = Keys.Enter Then
            If texto = "" Then
                lblMoneda.Text = ""
            Else
                mostrarMoneda(texto)
                'llevamos el foco a listya precio
                txtListaPrecio.Focus()
            End If
        ElseIf e.KeyValue = Keys.Add Then
            Dim ds As DataSet = servicio1.obtenerMonedas("")
            Dim moneda As New frmMoneda(ds)
            If moneda.ShowDialog() = Windows.Forms.DialogResult.OK Then
                util.enfocar()
            Else
                txtMoneda.Text = ""
            End If
        End If
    End Sub

    Private Sub txtListaPrecio_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles txtListaPrecio.KeyDown
        Dim texto As String = txtListaPrecio.Text.Trim

        If e.KeyValue = Keys.Enter Then
            If texto = "" Then
                lblListaPrecio.Text = ""
            Else
                mostrarListaPrecios(texto)
                'llevamos el foco hacia almacen
                txtAlmacen.Focus()
            End If
        ElseIf e.KeyValue = Keys.Add Then
            Dim ds As DataSet = servicio1.obtenerListaPrecios("")
            Dim listaP As New frmListaPrecio(ds)
            If listaP.ShowDialog() = Windows.Forms.DialogResult.OK Then
                util.enfocar()
            Else
                txtListaPrecio.Text = ""
            End If
        End If
    End Sub

    Private Sub txtSucursal_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles txtSucursal.KeyDown
        Dim texto As String = txtSucursal.Text.Trim
        If e.KeyValue = Keys.Enter Then
            If texto = "" Then
                lblSucursal.Text = ""
            Else
                mostrarSucursalCliente(texto, txtCliente.Text.Trim)
            End If
        ElseIf e.KeyValue = Keys.Add Then
            Dim ds As DataSet = servicio1.obtenerAgenciaSucursalXCliente(texto, txtCliente.Text.Trim)
            Dim frmAgen As New frmAgencia(ds, 0)
            If frmAgen.ShowDialog = Windows.Forms.DialogResult.OK Then
                util.enfocar()
            Else
                txtSucursal.Text = ""
            End If
        End If
    End Sub

    Private Sub txtDireccionEntrega_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles txtDireccionEntrega.KeyDown
        Dim texto As String = txtDireccionEntrega.Text.Trim

        If e.KeyValue = Keys.Enter Then
            If texto = "" Then
                lblDireccionEntrega.Text = ""
            Else
                mostrarDireccionEntrega(texto, txtCliente.Text.Trim)
            End If
        ElseIf e.KeyValue = Keys.Add Then
            Dim ds As DataSet = servicio1.listarDireccionEntrega("", txtCliente.Text.Trim)
            Dim frmDirecc As New frmDireccionEntrega(txtCliente.Text.Trim, ds)
            If frmDirecc.ShowDialog = Windows.Forms.DialogResult.OK Then
                util.enfocar()
            Else
                txtDireccionEntrega.Text = ""
            End If
        End If
    End Sub

    Private Sub txtBanco_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles txtBanco.KeyDown
        Dim texto As String = txtBanco.Text.Trim

        If e.KeyValue = Keys.Enter Then
            If texto = "" Then
                lblBanco.Text = ""
            Else
                mostrarBanco(texto)
            End If
        ElseIf e.KeyValue = Keys.Add Then
            Dim ds As DataSet = servicio1.obtenerListaBancos("")
            Dim frmBanco As New frmBanco(ds)
            If frmBanco.ShowDialog = Windows.Forms.DialogResult.OK Then
                util.enfocar()
            Else
                txtBanco.Text = ""
            End If
        End If
    End Sub

    Private Sub txtAlmacen_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles txtAlmacen.KeyDown
        Dim texto As String = txtAlmacen.Text.Trim

        If e.KeyValue = Keys.Enter Then
            If texto = "" Then
                lblAlmacen.Text = ""
            Else
                mostrarAlmacen(texto)
                'llevamos el foco hacia articulo
                txtArticulo.Focus()
            End If
        ElseIf e.KeyValue = Keys.Add Then
            Dim ds As DataSet = servicio1.listarAlmacen("")
            Dim frmalm As New frmAlmacen(ds)
            If frmalm.ShowDialog = Windows.Forms.DialogResult.OK Then
                util.enfocar()
            Else
                txtAlmacen.Text = ""
            End If
        End If
    End Sub

    Private Sub txtFormaPago_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles txtFormaPago.KeyDown
        Dim texto As String = txtFormaPago.Text.Trim

        If e.KeyValue = Keys.Enter Then
            If texto = "" Then
                lblFormaPago.Text = ""
                txtFormaPago.Text = ""
                lblFormaPago.Text = ""
                cantMinima = 0.0
                porcenFP = 0.0
                recalcularPedidoXFormaPago(0, CDec(txtTotal.Text.Trim), cantMinima)
                mostrarTotalesPedido()
            Else
                mostrarFormaPago(txtCondVenta.Text.Trim, txtMoneda.Text.Trim, texto)
            End If
        ElseIf e.KeyValue = Keys.Add Then
            Dim ds As DataSet = servicio1.obtenerFormaPago(txtCondVenta.Text.Trim, txtMoneda.Text.Trim, "")
            Dim frmFP As New frmFormaPago(ds)
            If frmFP.ShowDialog = Windows.Forms.DialogResult.OK Then
                util.enfocar()
            Else
                txtFormaPago.Text = ""
                util.enfocar()
            End If
        End If
    End Sub

    Private Sub btnGuardar_Click(sender As System.Object, e As System.EventArgs) Handles btnGuardar.Click
        transaccionDocumento(txtPedido.Text.Trim)
    End Sub

    Private Sub txtCliente_LostFocus(sender As Object, e As System.EventArgs) Handles txtCliente.LostFocus
        validacion02()
    End Sub

    Private Sub txtCondVenta_LostFocus(sender As Object, e As System.EventArgs) Handles txtCondVenta.LostFocus
        validacion02()
    End Sub

    Private Sub txtMoneda_LostFocus(sender As Object, e As System.EventArgs) Handles txtMoneda.LostFocus
        validacion02()
    End Sub

    Private Sub txtListaPrecio_LostFocus(sender As Object, e As System.EventArgs) Handles txtListaPrecio.LostFocus
        validacion02()
    End Sub

    Private Sub txtTipoDocumento_LostFocus(sender As Object, e As System.EventArgs) Handles txtTipoDocumento.LostFocus
        validacion02()
    End Sub

    Private Sub txtCliente_GotFocus(sender As Object, e As System.EventArgs) Handles txtCliente.GotFocus
        validacion02()
    End Sub

    Private Sub txtTipoDocumento_GotFocus(sender As Object, e As System.EventArgs) Handles txtTipoDocumento.GotFocus
        validacion02()
    End Sub

    Private Sub txtCondVenta_GotFocus(sender As Object, e As System.EventArgs) Handles txtCondVenta.GotFocus
        validacion02()
    End Sub

    Private Sub txtMoneda_GotFocus(sender As Object, e As System.EventArgs) Handles txtMoneda.GotFocus
        validacion02()
    End Sub

    Private Sub txtListaPrecio_GotFocus(sender As Object, e As System.EventArgs) Handles txtListaPrecio.GotFocus
        validacion02()
    End Sub

    Private Sub TContro1_GotFocus(sender As Object, e As System.EventArgs) Handles TContro1.GotFocus
        validacion02()
    End Sub

    Private Sub TContro1_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles TContro1.SelectedIndexChanged
        'Obtenemos el indice posicionado actualmente
        Dim tab As Integer = TContro1.SelectedIndex

        ''Preguntamos si al apretar otro tab que no es el primero (0)
        'If tab <> 0 Then
        '    'Hacemos que pase la primera validacion de vacios
        '    If validacion01() = False Then
        '        'si no pasa la validación siempre vuelve al primer TAB
        '        TContro1.SelectedIndex = 0
        '    End If
        'End If

        'Preguntamos si al apretar otro TAB no es el segundo(1)

        If tab <> 0 Then
            limpiarTABAgregarArticulos()
        End If
    End Sub

    Private Sub txtArticulo_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles txtArticulo.KeyDown
        Dim texto As String = txtArticulo.Text.Trim

        If e.KeyValue = Keys.Enter Then
            If texto = "" Then
                limpiarTABAgregarArticulos()
                txtAlmacen.Focus()
            Else
                mostrarArticulo(texto, txtAlmacen.Text.Trim)
                txtCantidad.Focus()
            End If
        ElseIf e.KeyValue = Keys.Add Then
            arti = New frmBusqArticulo(txtAlmacen.Text.Trim, txtMoneda.Text.Trim)
            If arti.ShowDialog() = Windows.Forms.DialogResult.OK Then
                util.enfocar()
            Else
                txtArticulo.Text = ""
            End If
        End If
    End Sub

    Private Sub txtCantidad_LostFocus(sender As Object, e As System.EventArgs) Handles txtCantidad.LostFocus
        Dim dividendo As Integer = CInt(txtCantidad.Text)
        Dim divisor As Integer = txtCantidad.Minimum
        If dividendo Mod divisor <> 0 Then
            util.mensaje("La cantidad no concuerda a la unidad de venta.")
            txtCantidad.Text = cantArt
        End If
    End Sub

    Private Sub txtCantidad_ValueChanged(sender As Object, e As System.EventArgs) Handles txtCantidad.ValueChanged
        If booleano3 = True Then
            'Evento que controla el descuento del articulo segun la cantidad
            txtDescuento.Text = Format(Val(calcularDescuentoCantidad(CInt(txtCantidad.Text))), "##,##0.00")
            varDescuento = txtDescuento.Text.Trim
            txtPrecioSIGV.Text = Format(Val(calcularPrecioARTSinIGV(CDec(txtPrecio.Text.Trim), CDec(txtDescuento.Text.Trim))), "##,##0.00")
            txtPrecioCIGV.Text = Format(Val(calcularPrecioARTConIGV(CDec(txtPrecioSIGV.Text.Trim))), "##,##0.00")
        End If
    End Sub

    Private Sub btnAgregar_Click(sender As System.Object, e As System.EventArgs) Handles btnAgregar.Click
        'verificamos si el articulo se encuentra en la grilla
        If buscarArticuloEnGrilla(txtArticulo.Text.Trim) = 0 Then
            util.mensaje("El artículo se encuentra en el pedido como eliminado.")
        ElseIf buscarArticuloEnGrilla(txtArticulo.Text.Trim) = 1 Then
            'preguntamos si se quiere actualizar el articulo
            If MsgBox("¿Artículo ya se encuentra agregado, Desea actualizarlo?", MsgBoxStyle.Question + MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton2, "Mensajes al Usuario") = MsgBoxResult.Yes Then
                Dim descuento As Decimal = CDec(txtDescuento.Text.Trim)
                Dim excDscto As String = "0"
                If descuento > CDec(varDescuento) Then
                    excDscto = "1"
                End If

                actualizarArticuloGrilla(txtArticulo.Text.Trim, txtAlmacen.Text.Trim, txtMoneda.Text.Trim, txtListaPrecio.Text.Trim, monCodigoSIS, CInt(txtCantidad.Text),
                                         atenArticulo, CDec(txtDescuento.Text.Trim), CDec("0.0"),
                                         dcdCodigoArt, actiArt, excDscto, "0")

                mostrarTotalesPedido()

                'repintar()
            End If
        Else
            'Se procede a la insercion en la grilla
            Dim numeracion As Integer = dgvPedido.Rows.Count + 1
            Dim almacen As String = txtAlmacen.Text.Trim
            Dim entArticulo As Articulo = servicio2.obtenerArticulo(txtArticulo.Text)
            Dim precio As Decimal = CDec(txtPrecioSIGV.Text.Trim)
            Dim cantidad As Integer = CInt(txtCantidad.Text)
            Dim atendido As Integer = 0
            Dim descuento As Decimal = CDec(txtDescuento.Text.Trim)
            Dim descCondicional As Decimal = 0.0
            Dim porcPercepcion As Decimal = obtenerPorcentajePercepcion(CDec(entArticulo.ART_Percepcion), CDec(entArticulo.ART_ZEmergencia), cliente)
            Dim subtotal As Decimal = calcularSubtotalArticulo(precio, cantidad, descuento / 100, descCondicional / 100, porcPercepcion / 100)
            Dim precioSoles As Decimal = IIf(txtMoneda.Text = "01", precio, otroPrecioArticulo)
            Dim precioDolares As Decimal = calcularPrecioARTSinIGV(IIf(txtMoneda.Text = "02", precio, otroPrecioArticulo), descuento / 100)
            Dim montoPercepcion As Decimal = calcularMontoPorcPercepcion(porcPercepcion / 100, subtotal)
            Dim dcdCodigo As String = ""
            Dim activado As String = "1"
            Dim excDscto As String = "0"
            If descuento > CDec(varDescuento) Then
                excDscto = "1"
            End If
            Dim verificado As String = "0"

            agregarArticuloGrilla(numeracion, almacen, entArticulo.ART_Codigo, entArticulo.ART_Descripcion, entArticulo.UNM_Descripcion, precio, cantidad, atendido, descuento,
                                  Format(Val(descCondicional), "##,##0.00"), porcPercepcion, subtotal, precioSoles, precioDolares, montoPercepcion, dcdCodigo, activado, excDscto, verificado)

            mostrarTotalesPedido()
            'repintar()
        End If
    End Sub

    Private Sub btnVerificar_Click(sender As System.Object, e As System.EventArgs) Handles btnVerificar.Click
        transaccionDetalle(txtPedido.Text.Trim)
    End Sub

    Private Sub dgvPedido_CellClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvPedido.CellClick
        'con este evento haremos que se edite el articulo
        Dim f As Integer = e.RowIndex

        If f > -1 Then
            mostrarAlmacen(dgvPedido.Item("Column9", f).Value)
            mostrarArticulo(dgvPedido.Item("Column6", f).Value, dgvPedido.Item("Column9", f).Value)
            txtCantidad.Text = IIf(dgvPedido.Item("clmAtendido", f).Value = "0", dgvPedido.Item("cantidad", f).Value, dgvPedido.Item("clmAtendido", f).Value)
            cantArt = CInt(IIf(dgvPedido.Item("clmAtendido", f).Value = "0", dgvPedido.Item("cantidad", f).Value, dgvPedido.Item("clmAtendido", f).Value))
            txtDescuento.Text = dgvPedido.Item("descuento", f).Value
            'seteamos el valor del atendido en la variable atenArticulo
            atenArticulo = CInt(dgvPedido.Item("clmAtendido", f).Value)
            dcdCodigoArt = dgvPedido.Item("Column12", f).Value
            actiArt = dgvPedido.Item("Column13", f).Value
            'verifArt = dgvPedido.Item("Column14", f).Value
            If dgvPedido.Item("Column10", f).Value = "1" Then
                chkCambioDscto.Checked = True
            ElseIf dgvPedido.Item("Column10", f).Value = "0" Then
                chkCambioDscto.Checked = False
            End If
        End If
    End Sub

    Private Sub dgvPedido_CellFormatting(sender As Object, e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles dgvPedido.CellFormatting
        For i = 0 To dgvPedido.Rows.Count - 1
            If dgvPedido.Item("Column13", i).Value = "0" And e.RowIndex = i Then
                e.CellStyle.BackColor = Color.Red
                e.CellStyle.ForeColor = Color.White
            Else
                If dgvPedido.Item("Column14", i).Value = "0" And e.RowIndex = i Then
                    e.CellStyle.BackColor = Color.PaleGreen
                Else
                    If dgvPedido.Item("Column13", i).Value = "1" And CInt(dgvPedido.Item("clmAtendido", i).Value) < CInt(dgvPedido.Item("cantidad", i).Value) And e.RowIndex = i Then
                        dgvPedido.Item("cantidad", e.RowIndex).Style.ForeColor = Color.White
                        dgvPedido.Item("clmAtendido", e.RowIndex).Style.ForeColor = Color.White
                        dgvPedido.Item("cantidad", e.RowIndex).Style.BackColor = Color.Red
                        dgvPedido.Item("clmAtendido", e.RowIndex).Style.BackColor = Color.Red
                    End If

                    If dgvPedido.Item("Column10", i).Value = "1" And e.RowIndex = i Then
                        dgvPedido.Item("descuento", e.RowIndex).Style.BackColor = Color.Orange
                    End If
                End If
            End If
        Next
    End Sub

    'Sub repintar()
    '    For Each fila As DataGridViewRow In dgvPedido.Rows
    '        If fila.Cells("Column13").Value = "0" Then
    '            fila.DefaultCellStyle.BackColor = Color.Red
    '            fila.DefaultCellStyle.ForeColor = Color.White
    '        Else
    '            If fila.Cells("Column14").Value = "0" Then
    '                fila.DefaultCellStyle.BackColor = Color.PaleGreen
    '            End If
    '        End If
    '    Next
    'End Sub

    Private Sub dgvPedido_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles dgvPedido.KeyDown
        'controlamos cuando el usuario no quiiere un articulo
        If dgvPedido.Rows.Count > 0 Then
            If e.KeyCode = Keys.Delete Then
                'If dgvPedido.Rows(dgvPedido.CurrentCell.RowIndex).DefaultCellStyle.BackColor = Color.Red Then
                '    dgvPedido.Rows(dgvPedido.CurrentCell.RowIndex).DefaultCellStyle.BackColor = Color.Empty
                '    dgvPedido.Rows(dgvPedido.CurrentCell.RowIndex).DefaultCellStyle.ForeColor = Color.Black
                '    dgvPedido.Rows(dgvPedido.CurrentCell.RowIndex).Cells("Column13").Value = "1"
                '    dgvPedido.Rows(dgvPedido.CurrentCell.RowIndex).Cells("Column13").Selected = False
                '    mostrarTotalesPedido()
                'Else
                '    dgvPedido.Rows(dgvPedido.CurrentCell.RowIndex).DefaultCellStyle.BackColor = Color.Red
                '    dgvPedido.Rows(dgvPedido.CurrentCell.RowIndex).DefaultCellStyle.ForeColor = Color.White
                '    dgvPedido.Rows(dgvPedido.CurrentCell.RowIndex).Cells("Column13").Value = "0"
                '    dgvPedido.Rows(dgvPedido.CurrentCell.RowIndex).Cells("Column13").Selected = False
                '    mostrarTotalesPedido()
                'End If

                If dgvPedido.Rows(dgvPedido.CurrentCell.RowIndex).Cells("Column13").Value = "0" Then
                    dgvPedido.Rows(dgvPedido.CurrentCell.RowIndex).Cells("Column13").Value = "1"
                    dgvPedido.Rows(dgvPedido.CurrentCell.RowIndex).Cells("Column13").Selected = False
                    mostrarTotalesPedido()
                    'repintar()
                Else
                    dgvPedido.Rows(dgvPedido.CurrentCell.RowIndex).Cells("Column13").Value = "0"
                    dgvPedido.Rows(dgvPedido.CurrentCell.RowIndex).Cells("Column13").Selected = False
                    mostrarTotalesPedido()
                    'repintar()
                End If
            End If
        End If
    End Sub

    Private Sub chkCambioDscto_CheckedChanged(sender As Object, e As System.EventArgs) Handles chkCambioDscto.CheckedChanged
        If chkCambioDscto.Checked Then
            txtDescuento.ReadOnly = False
        Else
            txtDescuento.Text = varDescuento
            txtDescuento.ReadOnly = True
        End If
    End Sub

    Private Sub btnLimpiar_Click(sender As System.Object, e As System.EventArgs) Handles btnLimpiar.Click
        limpiarTABAgregarArticulos()
        txtAlmacen.Focus()
    End Sub

    Private Sub btnEliminar_Click(sender As System.Object, e As System.EventArgs) Handles btnEliminar.Click
        eliminarDocumento(txtPedido.Text.Trim)
    End Sub

    Private Sub btnImpresora_Click(sender As System.Object, e As System.EventArgs) Handles btnImpresora.Click
        'Con este evento se realiza la impresion de los documentos
        imprimirDocumento()
    End Sub

    Private Sub btnMensajeria_Click(sender As System.Object, e As System.EventArgs) Handles btnMensajeria.Click
        enviarMensaje()
    End Sub

    Private Sub btnAsignar_Click(sender As System.Object, e As System.EventArgs) Handles btnAsignar.Click
        Dim frmAsigAgencia As New frmAgenciaCliente(txtCliente.Text.Trim, txtRazonSocial.Text.Trim, 0)
        If frmAsigAgencia.ShowDialog = Windows.Forms.DialogResult.OK Then
            txtSucursal.Focus()
            util.enfocar()
        Else
            txtSucursal.Text = ""
            txtSucursal.Focus()
        End If
    End Sub

    Private Sub btnAprobar_Click(sender As System.Object, e As System.EventArgs) Handles btnAprobar.Click
        aprobarPedido(txtPedido.Text.Trim, TDOC)
    End Sub

End Class